const callbacks = {}

/**
 * 加载一个远程脚本
 * @param {String} src 一个远程脚本
 * @param {Function} callback 回调
 */
function loadScript(src, callback) {
	const existingScript = document.getElementById(src)
	const cb = callback || (() => {})
	if (!existingScript) {
		callbacks[src] = []
		const $script = document.createElement('script')
		$script.src = src
		$script.id = src
		$script.async = 1
		document.body.appendChild($script)
		const onEnd =
			'onload' in $script ? stdOnEnd.bind($script) : ieOnEnd.bind($script)
		onEnd($script)
	}

	callbacks[src].push(cb)

	function stdOnEnd(script) {
		script.onload = () => {
			this.onerror = this.onload = null
			callbacks[src].forEach(item => {
				item(null, script)
			})
			delete callbacks[src]
		}
		script.onerror = () => {
			this.onerror = this.onload = null
			cb(new Error(`Failed to load ${src}`), script)
		}
	}

	function ieOnEnd(script) {
		script.onreadystatechange = () => {
			if (this.readyState !== 'complete' && this.readyState !== 'loaded') return
			this.onreadystatechange = null
			callbacks[src].forEach(item => {
				item(null, script)
			})
			delete callbacks[src]
		}
	}
}

/**
 * 顺序加载一组远程脚本
 * @param {Array} list 一组远程脚本
 * @param {Function} cb 回调
 */
export function loadScriptQueue(list, cb) {
	const first = list.shift()
	list.length
		? loadScript(first, () => loadScriptQueue(list, cb))
		: loadScript(first, cb)
}

export default loadScript
